package com.ycg.biquge.controller;

import com.ycg.biquge.common.Result;
import com.ycg.biquge.pojo.Novel;
import com.ycg.biquge.pojo.vo.CategoryVos;
import com.ycg.biquge.pojo.vo.DetailNovelVo;
import com.ycg.biquge.pojo.vo.SimpleNovel;
import com.ycg.biquge.service.NovelService;
import com.ycg.biquge.uitls.CheckType;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author YCG
 * @date 2024-04-29 21:03
 * @description 小说控制器
 */
@RestController
@RequestMapping("/novel")
public class NovelController {

    @Resource
    private NovelService novelService;

    /**
     * 获取热门小和top推荐小说
     *
     * @return map hots:[]   tops:[]
     */
    @GetMapping("/recommend")
    public Result<Map<String, List<Novel>>> getRecommend() {
        return novelService.getHotAndTop();
    }

    /**
     * 获取首页 分类列表, 热门
     *
     * @return map: category1:CategoryVos, category2:CategoryVos ...
     */
    @GetMapping("/category")
    public Result<Map<String, CategoryVos>> getCategory() {
        return novelService.getCategory();
    }

    /**
     * 获取分类下的小说
     *
     * @param page 当前页, 每页固定15个实例
     * @param type 分类类型
     * @return 小说列表
     */
    @CheckType
    @GetMapping("/category/{type}/{page}")
    public Result<List<Novel>> getCategoryList(
            @NotBlank(message = "小说类型不为空") @PathVariable  String type,
            @Min(value = 0,message = "分页应大于0") @PathVariable Integer page) {
        return novelService.getCategoryList(page, type);
    }

    /**
     * 获取已经完本的小说
     *
     * @return 小说列表
     */
    @GetMapping("/category/finish/{page}")
    public Result<List<Novel>> getFinishList(@PathVariable("page") Integer page) {
        return novelService.getFinish(page);
    }

    /**
     * 获取首页最近更新和上架的小说列表 每个 30条
     *
     * @return 最近更新小说 和 最新入库小说
     */
    @GetMapping("/new")
    public Result<Map<String, List<Novel>>> getNew() {
        return novelService.getNew();
    }

    /**
     * 根据id 获取小说简要信息
     *
     * @param id 当前小说id
     * @return 简要小说信息
     */
    @GetMapping("/{id}")
    public Result<Novel> getById(@PathVariable Integer id) {
        return novelService.getSimpleById(id);
    }

    /**
     * 根据id 获取小说详细信息 包括章节信息
     *
     * @param id 当前小说id
     * @return 小说信息 + 章节列表
     */
    @GetMapping("/detail/{id}")
    public Result<DetailNovelVo> getDetailById(@PathVariable Integer id) {
        return novelService.getDetailById(id);
    }

    /**
     * 获取各类型小说排行
     *  每个分类取前50个
     * @return key:小说类型  value:该类型下前50个列表
     */
    @GetMapping("/ranking")
    public Result<Map<String,List<SimpleNovel>>> getRanking() {
        return novelService.getRanking();
    }


}
